# 单元测试：通过函数编辑的程序，就可以编写相应的单元测试了
# 导入模块：每个py文件就是一个模块，一个模块可以通过导入来使用另一个模块的内容
# from 模块路径.模块名称 import 模块中的变量或函数   模块中的变量或函数：导入不在同目录的模块时，需要指定路径
# 导入模块
import sys
from io import StringIO
from 函数基础.计算器_函数优化 import get_number, get_mark, cal
# 定义测试函数，用于测试get_number函数
def test_get_number():
    print("---------测试get_number函数---------------")
    # 保存原始的input函数，以便后续恢复
    original_input = __builtins__.input
    # 临时替换input函数，使其始终返回
    __builtins__.input = lambda x: '123'
    # 调用get_number函数兵获取结果
    result = get_number('请输入数字：')
    # 恢复原始的input函数
    __builtins__.input = original_input
    assert int(result) == 123, '输入数字不正确'
    print("测试通过")

def test_get_mark():
    print("---------测试get_mark函数---------------")
    # 保存原始的input函数，以便后续恢复
    original_input = __builtins__.input
    # 临时替换input函数，使其始终返回'+'
    __builtins__.input = lambda _: '+'
    # 调用get_mark函数并获取结果
    result = get_mark()
    # 恢复原始的input函数
    __builtins__.input = original_input
    assert result == '+', '输入运算符不正确'
    print('测试通过')

# 定义测试函数，用于测试cal函数
def test_cal(input_values, expected_output):
    print("---------测试cal函数---------------")
    # 保存原始的input函数，以便后续恢复
    original_input = __builtins__.input
    # 保存原始的标准输出，以便后续恢复，sys.stdout就是用做控制台输出内容的
    original_stdout = sys.stdout
    # 输入多个值
    __builtins__.input = lambda _: next(input_values)  # 修改：使用全局迭代器
    # 重定向标准输出到StringIO对象，以便捕获输出内容
    sys.stdout = StringIO()
    # 调用cal函数
    cal()
    # 获取并清理标准输出的内容
    output = sys.stdout.getvalue().strip()
    print("output", output)  # 打印输出内容，用于调试
    # 恢复原始的标准输出
    sys.stdout = original_stdout
    # 恢复原始的input函数
    __builtins__.input = original_input
    # 断言处理
    assert expected_output in output, 'test_cal 测试失败'
    print('test_cal 测试成功')

def test_plus():
    print('测试加法')
    # 按顺序返回'2'、'3'、'+'
    input_values = iter(['2', '3', '+'])
    expected_output = '2+3=5'
    test_cal(input_values, expected_output)


def test_minus():
    print('测试减法')
    input_values = iter(['5', '3', '-'])
    expected_output = '5-3=2'
    test_cal(input_values, expected_output)


def test_multiply():
    print('测试乘法')
    input_values = iter(['2', '3', '*'])
    expected_output = '2*3=6'
    test_cal(input_values, expected_output)


def test_divide():
    print('测试除法')
    input_values = iter(['6', '3', '/'])
    expected_output = '6/3=2'
    test_cal(input_values, expected_output)

if __name__ == '__main__':
    test_get_number()
    test_get_mark()
    # 测试cal函数的加减乘除运算--有误，延后处理
    # test_plus()
    # test_minus()
    # test_multiply()
    # test_divide()

